package com.kl.modular.generate.service.impl;

import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;

import com.kl.common.util.DateUtil;
import com.kl.common.util.FreemarkerUtil;
import com.kl.modular.generate.bo.ColumnBo;
import com.kl.modular.generate.bo.TableBo;
import com.kl.modular.generate.dao.mapper.ColumnMapper;
import com.kl.modular.generate.dao.mapper.TableMapper;
import com.kl.modular.generate.model.config.GenerateCodeConfig;
import com.kl.modular.generate.service.IGenerateService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.kl.modular.generate.model.Column;
import com.kl.modular.generate.model.Table;
import com.kl.modular.generate.model.config.BaseConfig;
import com.kl.modular.generate.util.GenerateFunctionUtil;

/**
 * 代码生成serviceImpl
 * 
 * @author zjb
 * @date 2015-4-3
 */
@Service
public class GenerateServiceImpl implements IGenerateService {

	private static final Logger logger = LoggerFactory.getLogger(GenerateServiceImpl.class);

	@Autowired
	private ColumnMapper columnMapper;

	@Autowired
	private TableMapper tableMapper;

	public void createCodeForCRUD(GenerateCodeConfig config, ServletContext context) throws Exception {

		for (int i = 0; i < config.getTableName().length; i++) {
			// 获取表字段信息
			ColumnBo columnBo = new ColumnBo();
			columnBo.setDataName(config.getDataName());
			columnBo.setTableName(config.getTableName()[i]);
			List<Column> columnList = columnMapper.getColumnInfoByTableNameAndDataName(columnBo);
			// 处理信息
			columnList = GenerateFunctionUtil.dataColumnToProperty(columnList);
			Column columnPriKey = GenerateFunctionUtil.getTablePriKey(columnList);
			// 获取表信息
			TableBo tableBo = new TableBo();
			tableBo.setDataName(config.getDataName());
			tableBo.setTableName(config.getTableName()[i]);
			Table table = tableMapper.getTableInfoByTableNameAndDataName(tableBo);
			table.setModelName(GenerateFunctionUtil.tableNameToModelName(table.getTableName()));
			// 获取当前时间
			String nowDate = DateUtil.dateToString(new Date(), DateUtil.patternE);
			Map<String, Object> generateMap = new HashMap<String, Object>();
			generateMap.put("config", config);
			generateMap.put("columnList", columnList);// 表字段
			generateMap.put("table", table);// 表信息
			generateMap.put("nowDate", nowDate);// 当前时间
			generateMap.put("modelNameVariable", GenerateFunctionUtil.firstLetterToLopper(table.getModelName()));// 实体类变量名
			generateMap.put("columnPriKey", columnPriKey);// 主键字段信息
			generateMap.put("xmlDataPre", "#{");// 添加特殊符号
			generateMap.put("xmlDataSur", "}");// 添加特殊符号
			generateMap.put("jstlq", "${");
			generateMap.put("jstlh", "}");
			generateMap.put("shiro_haspermission", "@shiro.hasPermission");
			generateMap.put("ftl_list_tag", "#list");
			generateMap.put("ftl_if_tag","#if");
			generateMap.put("ftl_include_tag", "#include");
			/******************************** 生成model *******************************/
			if (config.getModelConfig().getIsCreate() == BaseConfig.CREATE_YES) {
				File genFile = new File(config.getPackagePath());
				if (!genFile.exists()) {
					genFile.mkdirs();// 生成总目录
				}
				File modelFile = new File(config.getModelConfig().getFilePath());
				if (!modelFile.exists()) {
					modelFile.mkdirs();// 生成实体类目录
				}
				String modelFilePath = config.getModelConfig().getFilePath() + "//" + table.getModelName() + ".java";// model文件路径

				FreemarkerUtil.create(context, generateMap, config.getModelConfig().getFtlUrl(), modelFilePath);// 生成文件
				logger.info(config.getTableName()[i] + ":实体类model生成成功");
			}
			/******************************** 生成mapper *******************************/
			if (config.getMapperConfig().getIsCreate() == BaseConfig.CREATE_YES) {
				File mapperFile = new File(config.getMapperConfig().getFilePath());
				if (!mapperFile.exists()) {
					mapperFile.mkdirs();// 生成mapper目录
				}
				String mapperFilePath = mapperFile.getPath() + "//" + table.getModelName() + config.getMapperConfig().getFileSuffixName() + ".java";// mapper文件路径
				FreemarkerUtil.create(context, generateMap, config.getMapperConfig().getFtlUrl(), mapperFilePath);// 生成文件
				logger.info(config.getTableName()[i] + ":数据Mapper接口生成成功");
			}
			/******************************** 生成mapper xml *******************************/
			if (config.getMapperXmlConfig().getIsCreate() == BaseConfig.CREATE_YES) {
				File mapperXmlFile = new File(config.getMapperXmlConfig().getFilePath());
				if (!mapperXmlFile.exists()) {
					mapperXmlFile.mkdirs();// 生成mapping xml目录
				}
				String mapperXmlFilePath = mapperXmlFile.getPath() + "//" + table.getModelName() + config.getMapperXmlConfig().getFileSuffixName() + ".xml";// mapper文件路径
				FreemarkerUtil.create(context, generateMap, config.getMapperXmlConfig().getFtlUrl(), mapperXmlFilePath);// 生成文件
				logger.info(config.getTableName()[i] + ":数据sqlxml生成成功");
			}
			/******************************** 生成service *******************************/
			if (config.getServiceConfig().getIsCreate() == BaseConfig.CREATE_YES) {
				File serviceFile = new File(config.getServiceConfig().getFilePath());
				if (!serviceFile.exists()) {
					serviceFile.mkdirs();// 生成service目录
				}
				String serviceFilePath = config.getServiceConfig().getFilePath() + "//" + config.getServiceConfig().getFilePreFixName() + table.getModelName()
						+ config.getServiceConfig().getFileSuffixName() + ".java";// service文件路径
				FreemarkerUtil.create(context, generateMap, config.getServiceConfig().getFtlUrl(), serviceFilePath);// 生成文件
				logger.info(config.getTableName()[i] + ":业务service生成成功");
			}

			/******************************** 生成serviceImpl *******************************/
			if (config.getServiceImplConfig().getIsCreate() == BaseConfig.CREATE_YES) {
				File serviceImplFile = new File(config.getServiceImplConfig().getFilePath());// 生成serviceImpl目录
				if (!serviceImplFile.exists()) {
					serviceImplFile.mkdirs();
				}
				String serviceImplFilePath = serviceImplFile.getPath() + "//" + table.getModelName() + config.getServiceImplConfig().getFileSuffixName() + ".java";// serviceImpl文件路径
				FreemarkerUtil.create(context, generateMap, config.getServiceImplConfig().getFtlUrl(), serviceImplFilePath);// 生成文件
				logger.info(config.getTableName()[i] + ":业务serviceImpl生成成功");
			}
			/******************************** 生成bo *******************************/
			if (config.getBoConfig().getIsCreate() == BaseConfig.CREATE_YES) {
				File boFile = new File(config.getBoConfig().getFilePath());
				if (!boFile.exists()) {
					boFile.mkdirs();// 生成bo目录
				}
				String boFilePath = boFile.getPath() + "//" + table.getModelName() + config.getBoConfig().getFileSuffixName() + ".java";// bo文件路径
				FreemarkerUtil.create(context, generateMap, config.getBoConfig().getFtlUrl(), boFilePath);// 生成文件
				logger.info(config.getTableName()[i] + ":业务bo生成成功");
			}
			/******************************** 生成Controller *******************************/
			if (config.getControllerConfig().getIsCreate() == BaseConfig.CREATE_YES) {
				File controllerFile = new File(config.getControllerConfig().getFilePath());
				if (!controllerFile.exists()) {
					controllerFile.mkdirs();// 生成controller目录
				}
				String controllerFilePath = controllerFile.getPath() + "//" + table.getModelName() + config.getControllerConfig().getFileSuffixName() + ".java";// controller文件路径
				// 生成文件
				FreemarkerUtil.create(context, generateMap, config.getControllerConfig().getFtlUrl(), controllerFilePath);
				logger.info(config.getTableName()[i] + ":Controller生成成功");
			}
			/******************************** 生成Controller *******************************/
			if (config.getViewConfig().getIsCreate() == BaseConfig.CREATE_YES) {
				File viewConfigFile = new File(config.getViewConfig().getFilePath() + "//" + GenerateFunctionUtil.firstLetterToLopper(table.getModelName()));
				if (!viewConfigFile.exists()) {
					viewConfigFile.mkdirs();// 生成View目录
				}
				String add = viewConfigFile.getPath() + "//" + "add" + table.getModelName() + ".ftl";
				String edit = viewConfigFile.getPath() + "//" + GenerateFunctionUtil.firstLetterToLopper(table.getModelName()) + "UpChange.ftl";
				String ajaxList = viewConfigFile.getPath() + "//" + GenerateFunctionUtil.firstLetterToLopper(table.getModelName()) + "AjaxList.ftl";
				String list = viewConfigFile.getPath() + "//" + GenerateFunctionUtil.firstLetterToLopper(table.getModelName()) + "List.ftl";
				// 生成文件
				FreemarkerUtil.create(context, generateMap, config.getViewConfig().getFtlAdd(), add);
				logger.info(config.getTableName()[i] + ":View add生成成功");
				FreemarkerUtil.create(context, generateMap, config.getViewConfig().getFtlEdit(), edit);
				logger.info(config.getTableName()[i] + ":View edit生成成功");
				FreemarkerUtil.create(context, generateMap, config.getViewConfig().getFtlList(), list);
				logger.info(config.getTableName()[i] + ":View list生成成功");
				FreemarkerUtil.create(context, generateMap, config.getViewConfig().getAjaxFtlList(), ajaxList);
				logger.info(config.getTableName()[i] + ":View ajaxList生成成功");
			}

		}
	}

}
